1.6 另一个 Dart 命令

除了 1.1 Dart 命令——Dart SDK 的入口 中提到的 dartdev 的 dart 命令外,Dart SDK 中还包含一个 dart 命令,位于 runtime/bin/main.cc,这是一个纯 C++ 实现的命令,作用也是编译执行 Dart 代码。在本文中,对这个命令的实现做简要介绍。

dart 是 Dart 运行时的主要可执行文件,它的构建定义在 BUILD.gn 文件中使用 dart_executable 模板:

dart_executable("dart") {
  extra_deps = [
    ":dart_snapshot_cc",
    "..:libdart_jit",
    "../platform:libdart_platform_jit",
  ]
  if (dart_runtime_mode != "release") {
    extra_deps += [ "../observatory:standalone_observatory_archive" ]
  }
  extra_sources = [
    "builtin.cc",
    "dartdev_isolate.cc",
    "dartdev_isolate.h",
    "dfe.cc",
    "dfe.h",
    "gzip.cc",
    "gzip.h",
    "loader.cc",
    "loader.h",
    "main.cc",
    "main_impl.cc",
  ]
  if (dart_runtime_mode == "release") {
    extra_sources += [ "observatory_assets_empty.cc" ]
  }
  if (!exclude_kernel_service) {
    extra_deps += [ ":dart_kernel_platform_cc" ]
  }
}

让我们逐部分分析:

  1. 依赖项 (extra_deps):

    • :dart_snapshot_cc: 包含 Dart VM 和 isolate 快照数据。
    • ...:libdart_jit: Dart JIT (即时编译) 运行时库。
    • ../platform:libdart_platform_jit: Dart 平台库的 JIT 版本。
    • 在非 release 模式下,还包括 ../observatory:standalone_observatory_archive,这是 Dart 的调试和性能分析工具。
    • 如果没有排除 kernel service,还包括 :dart_kernel_platform_cc
  2. 源文件 (extra_sources):

    • builtin.cc: 实现内置函数和对象。
    • dartdev_isolate.ccdartdev_isolate.h: 处理 dart 开发工具相关的 isolate。
    • dfe.ccdfe.h: 可能与 Dart 前端 (Dart Front End) 相关。
    • gzip.ccgzip.h: 处理 gzip 压缩。
    • loader.ccloader.h: 负责加载 Dart 代码和资源。
    • main.ccmain_impl.cc: 主程序入口和实现。
  3. 配置:

    • 使用了 dart_executable 模板,这个模板在文件的前面定义,它设置了一些通用的配置,如编译器标志、包含目录等。
    • 应用了 :export_api_symbols 配置,确保正确导出 Dart API 符号。
    • 根据 dart_runtime_mode 应用了不同的产品配置(release 或非 release)。
  4. 特殊处理:

    • 在 release 模式下,添加 observatory_assets_empty.cc,可能是为了省略调试相关的资源。
    • 根据 exclude_kernel_service 的设置决定是否包含 kernel service。
  5. 其他隐含的组成部分:

    • 通过 dart_executable 模板,它还包含了 crashpad(崩溃报告工具)、standalone_dart_io(Dart IO 库的独立实现)等依赖。
    • 包含了 BoringSSL 和 zlib 库的依赖。
  6. 平台特定的处理:

    • 在 Windows 上,会链接一些额外的系统库,如 ole32.lib, iphlpapi.lib 等。

总的来说,dart 可执行文件是一个复杂的构建产物,它集成了 Dart 运行时的核心组件、JIT 编译器、标准库实现、开发工具支持,以及各种必要的系统和第三方库。这使得它能够作为一个完整的 Dart 执行环境,支持运行和调试 Dart 程序。



本文作者:Maeiee

本文链接:1.6 另一个 Dart 命令

版权声明:如无特别声明,本文即为原创文章,版权归 Maeiee 所有,未经允许不得转载!


喜欢我文章的朋友请随缘打赏,鼓励我创作更多更好的作品!